var obj = {
    hi: function () {
        console.log(this);
        return () => {
            console.log(this);
        }
    },
    sayHi: function () {
        return function () {
            console.log(this);

            return () => {
                console.log(this);
            }
        }
    },
    say: () => {
        console.log(this);
    }
}
//以下代码一段一段执行,空行表示新的一段代码,执行一段代码时,注释其他所有段落代码:(2.js和3.js全在这)

obj.sayHi();// 1.直接调用 obj.sayHi(); 什么都没输出  ---  ①为什么什么都不输出?

//obj.hi();// 2.直接调用obj.hi(); 输出 obj

//let hi = obj.hi();// 3.赋值操作 输出 obj  ---  ②赋值时会运行赋值操作右边的函数吗?
// hi();// 调用hi(); 输出obj

// let sayHi = obj.sayHi();// 4.无输出
// sayHi();// 输出 一个 window

//let sayHi = obj.sayHi();// 5.---  ③请解释一下这整段代码,每一句操作运行时,函数内部是怎么执行的?
//let fun1 = sayHi();// 赋值操作 输出 window
//fun1();// 调用fun1(); 输出一个 window
// ④ [猜想] 调用栈 obj.sayHi->w.sayHi->w.fun1 第二个元素就是调用位置 调用位置上下文处于window,所以是this指向window吗?

//obj.say();// 6.输出 window

// let sayHi = obj.sayHi(); // 7.(3.js里的代码)
// let fun1 = sayHi(); //赋值操作 输出 window
// fun1(); // 调用fun1(); 输出一个 window
// let fun2 = sayHi.bind(obj)(); //赋值操作 输出 obj
// fun2();// 调用fun2(); 输出一个 obj